const fs = require("fs");
const EventEmitter = require("events");
const { resolveSoa } = require("dns");
const eve = new EventEmitter();

// 目标 实现在异步回调下得到的数据再用以异步请求数据
// 1.事件/发布订阅模式
// let obj = {}
// eve.on('ready',function(key,value){
//     console.log(key,value);
//         obj[key] = value;
//         if(Reflect.ownKeys(obj).length === 2){
//             console.log('请求完成',obj);
//         }
// })
// function render(){
//     fs.readFile('./1.txt','utf8',function(err,data){
//         if(err){
//             console.log(err);
//         }else{
//             eve.emit('ready','data1',data)
//         }
//     }),
//     fs.readFile('./2.txt','utf8',function(err,data){
//         if(err){
//             console.log(err);
//         }else{
//             // 异步请求数据成功 再通知下一次请求数据
//             eve.emit('ready','data2',data)
//         }
//     })
// }
// render()

// 2、哨兵变量
// let after = function (times, callback) {
//   // 存储变量
//   let res = {};
//   return function (key, value) {
//     res[key] = value;
//     if (Reflect.ownKeys(res).length === times) {
//       callback(res);
//     }
//   };
// };

// let done = after(2, function (data) {
//   console.log(data);
// });

// function render1() {
//   fs.readFile("./1.txt", "utf8", function (err, data) {
//     if (err) {
//       console.log(err);
//     } else {
//       done("data", data);
//     }
//   }),
//     fs.readFile("./2.txt", "utf8", function (err, data) {
//       if (err) {
//         console.log(err);
//       } else {
//         done("data1", data);
//       }
//     });
// }
// render1();

// 生成器Generator/Defrrred模式
// function* foo() {
//   var index = 0;
//   while (index < 2) {
//     yield index++ ;
//   }
//   return `${index}+ nihao`
// }
// var bar = foo();
// console.log(bar.next());
// console.log(bar.next());
// console.log(bar.next());

// async  await
// async功能：
// 1、函数返回值为一个promise 返回的值就data的值
// 2、
// async function fn(){
//     return 9
// }

// const f1 = fn()
// console.log(f1);
// f1.then((data,err)=>{
//     console.log(data);
// })

function readFile(filename) {
  return new Promise(function (resolve, reject) {
    fs.readFile(filename, "utf-8", (err, data) => {
      if (err) {
        reject(err);
      } else {
        resolve(data);
      }
    });
  });
}

function* read() {
  let template = yield readFile("./1.txt");
  console.log(template,'2');
  let data = yield readFile("./2.txt");
  return template + "+" + data;
}



// function co(fn) {
//   let gen = fn();
//   !(function next() {
//     new Promise((resolve, reject) => {
//       const { value, done } = gen.next();
//       console.log(value,done);
//       if (done) {
//         resolve(value);
//       } else {
//         value.then(next(), (err) => reject(err));
//       }
//     });
//   })();
// }
// function co(gen){
//     let it = gen() // 生成迭代器
//     return new Promise((resolve,reject)=>{
//         !function next(lastVal){
//             let { value,done} = it.next(lastVal);
//             if(done){ // 如果异步执行完毕 则返回done为true
//                 resolve(value)
//             }else{
//                 value.then(next,reason =>reject(reason));
//             }
//         }()
//     })
// }
// function co(fn) {
//   let gen = fn();
//   return new Promise((resolve, reject) => {
//     !(function next(val) {
//         console.log(val,'val');
//       const { value, done } = gen.next(val);
//       if (done) {
//         resolve(done);
//       } else {
//         value.then(next, (err) => reject(err));
//       }
//     })();
//   });
// }
// co(read).then(
//   (data) => {
//     console.log(data,'160');
//   },
//   (err) => {
//     console.log(err);
//   }
// );

function* foo(x) {
    var y = 2 * (yield (x + 1));
    var z = yield (y / 3);
    return (x + y + z);
  }

  var a = foo(5);
  console.log(a.next());
//   console.log(a);
  console.log(a.next(12));
  console.log(a.next(13)); 
